#include <bits/stdc++.h>
using namespace std;

//***************************************************************************
//可变模板参数
// 递归终止函数
//利用选择最匹配版本的原理，当可变模板参数大于两个时，就可以
template <class T,class K>
void ShowList(const T& t,const K& a)
{ 
    cout << t << "   "<< a << ' '<<endl;
}
// 展开函数
template <class T, class ...Args>
void ShowList(T value, Args... args)
{
    cout << value <<" ";
    ShowList(args...);
}
void Args_Test_Recursion()
{
    ShowList(1,'a');
    ShowList(1, 'A', 2, 'b', 3, 'c');
    ShowList(1, 'A', std::string("sort"));
    return ;
}


//
template <class T>
void PrintArg(const T& t)
{
 cout << t << " "<<"  "<<endl;
}
template <class ...Args>
void Args_Test_Iteration(Args... args)
{
    //展开函数,依次展开,相当于只对Print不断依次展开，后面的...其实就是代表不定个数
    int arr[] = { (PrintArg(args), 0)... };
    cout << endl;
}





//-------------------------------------------------------------
//可变参数模板可用于传参数，再C++11的STL里面，能够再节省提升一定的效率
template <class T,class K>
void GetAddr(const T& a,K&& b)
{
    cout<<"const T& "<<a<<endl<<"K&& "<<b<<endl;
}
template <class T>
void GetAddr(T& a)
{
    cout<<"const T& "<<a<<endl;
}

template <class K>
void GetAddr(K&& b)
{
    cout<<"K&& "<<b<<endl;
}

template <class K,class T>
void construct_pair(const K& k,const T& t)
{
    pair<K,T>kv(k,t);
}

//模板加右值引用，就是万能引用，可以引用左值或者右值
template <class ...Args>
void Pass(Args&& ...args)
{
    construct_pair(forward<Args>(args)...);
    GetAddr(forward<Args>(args)...);//这里值得注意的是，由于本质使用的是右值引用，使用之后，其实就是左值展开了，也就是说，传过去的值实际上左值引用时更适配的
    //所以想要保持其本真的属性，需要加上完美转发
    cout<<"Perfect Ref Pass"<<endl;
}

template <class ...Args>
void Pass1(Args&& ...args)
{
    Pass(forward<Args>(args)...);
}

void Test_Template()
{
    //解开注释 调试一下，可以发现可变参数列表也可以对应的万能引用和完美转发，传递多层的效果
    int a = 0;
    // Pass(a);
    // Pass(1);
    //Pass(a,1);
    Pass1(a,'1');
    return ;
}

int main()
{
    Test_Template();
}

//如果把上面的用在STL容器里面的构造传参那些，能一定程度上节省下多余构造的时间，
//但是由于C++11都实现右值引用版本，对许多都是构造加移动构造（右值引用去构造）使得就很省时间资源
//这种可变模板类型，只是少了一次移动构造，而移动构造本身并不花费许多时间，成本很低
//一般只有在自定义类型占据较大空间去构造时，这种构造方式才对构造加移动构造有优势

//*************************************************************************************
